<?php
declare(strict_types=1);

namespace app\controller;

use app\BaseController;
use app\service\MailService;
use think\facade\Db;
use think\facade\Cache;
use think\Response;

class Auth extends BaseController
{
    /**
     * 统一登录接口（支持邮箱密码和Apple登录）
     */
    public function login()
    {
        $data = $this->request->post();
        $type = $data['type'] ?? 'email'; // 登录类型：email 或 apple
        
        try {
            if ($type === 'apple') {
                return $this->appleLogin($data);
            } else {
                return $this->emailLogin($data);
            }
        } catch (\Exception $e) {
            return $this->error('登录失败：' . $e->getMessage());
        }
    }
    
    /**
     * 邮箱密码登录
     */
    private function emailLogin(array $data)
    {
        $email = $data['email'] ?? '';
        $password = $data['password'] ?? '';
        
        if (empty($email) || empty($password)) {
            return $this->error('邮箱和密码不能为空');
        }
        
        // 查找用户
        $user = Db::name('users')->where('email', $email)->find();
        if (!$user) {
            return $this->error('用户不存在');
        }
        
        // 验证密码
        if (strcmp($password, $user['password']) !== 0) {
            return $this->error('密码错误');
        }
        
        // 检查VIP状态
        $this->checkVipStatus($user['id']);
        
        // 生成token
        $token = $this->generateToken($user['id']);
        
        // 更新最后登录时间
        Db::name('users')->where('id', $user['id'])->update([
            'updated_at' => date('Y-m-d H:i:s')
        ]);
        
        return $this->success('登录成功', [
            'token' => $token,
            'user' => [
                'id' => $user['id'],
                'email' => $user['email'],
                'avatar' => $user['avatar'],
                'balance' => $user['balance'],
                'is_vip' => $user['is_vip'],
                'vip_expired_at' => $user['vip_expired_at']
            ]
        ]);
    }
    
    /**
     * Apple登录
     */
    private function appleLogin(array $data)
    {
        $appleUserId = $data['apple_user_id'] ?? '';
        $identityToken = $data['identity_token'] ?? '';
        $email = $data['email'] ?? ''; // 关键：确保使用传递参数中的email字段
        
        if (empty($appleUserId) || empty($identityToken)) {
            return $this->error('Apple登录参数不完整');
        }
        
        // 验证Apple Token（简化版，实际项目中需要完整验证）
        if (!$this->verifyAppleToken($identityToken)) {
            return $this->error('Apple Token验证失败');
        }
        
        // 查找是否已存在该Apple用户
        $user = Db::name('users')->where('apple_user_id', $appleUserId)->find();
        
        if (!$user) {
            // 新用户注册 - 关键修改：确保使用传递的email参数
            if (empty($email)) {
                return $this->error('新用户注册需要提供email字段');
            }
            
            // 检查邮箱是否已被使用
            $existingUser = Db::name('users')->where('email', $email)->find();
            if ($existingUser) {
                return $this->error('该邮箱已被其他账户使用');
            }
            
            $user = $this->createAppleUser($appleUserId, $email, $data);
            if (!$user) {
                return $this->error('创建用户失败');
            }
        } else {
            // 现有用户登录 - 如果提供了email且与现有不同，更新邮箱
            if (!empty($email) && $user['email'] !== $email) {
                // 检查新邮箱是否已被其他用户使用
                $existingUser = Db::name('users')
                    ->where('email', $email)
                    ->where('id', '<>', $user['id'])
                    ->find();
                    
                if (!$existingUser) {
                    Db::name('users')->where('id', $user['id'])->update([
                        'email' => $email,
                        'updated_at' => date('Y-m-d H:i:s')
                    ]);
                    $user['email'] = $email;
                }
            }
        }
        
        // 检查VIP状态
        $this->checkVipStatus($user['id']);
        
        // 生成token
        $token = $this->generateToken($user['id']);
        
        // 更新最后登录时间
        Db::name('users')->where('id', $user['id'])->update([
            'updated_at' => date('Y-m-d H:i:s')
        ]);
        
        return $this->success('Apple登录成功', [
            'token' => $token,
            'user' => [
                'id' => $user['id'],
                'email' => $user['email'],
                'avatar' => $user['avatar'],
                'balance' => $user['balance'],
                'is_vip' => $user['is_vip'],
                'vip_expired_at' => $user['vip_expired_at'],
                'apple_user_id' => $user['apple_user_id']
            ]
        ]);
    }
    
    /**
     * 用户注册
     */
    public function register() {
        $email = $this->request->post('email');
        $password = $this->request->post('password'); // 已加密的密码
        $nickname = $this->request->post('nickname');
        $verificationCode = $this->request->post('verificationCode'); // 修改参数名为verificationCode
        $avatar = $this->request->post('avatar', '');
        $latitude = $this->request->post('latitude', 0.0);
        $longitude = $this->request->post('longitude', 0.0);
        
        // 验证必填字段
        if (empty($email) || empty($password) || empty($verificationCode)) {
            return $this->error('邮箱、密码和验证码不能为空');
        }
        
        // 验证邮箱格式
        if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
            return $this->error('邮箱格式不正确');
        }
        
        // 验证邮箱验证码
        if (!$this->verifyEmailCode($email, $verificationCode, 'register')) {
            return $this->error('验证码无效或已过期');
        }
        
        try {
            // 检查邮箱是否已存在
            $existingUser = Db::name('users')->where('email', $email)->find();
            if ($existingUser) {
                return $this->error('邮箱已存在');
            }
            
            // 检查昵称是否已存在（仅当提供了昵称时检查）
            if (!empty($nickname)) {
                $existingNickname = Db::name('users')->where('nickname', $nickname)->find();
                if ($existingNickname) {
                    return $this->error('昵称已存在');
                }
            }
            
            // 创建用户数据
            $userData = [
                'email' => $email,
                'password' => $password, // 二次加密存储
                'nickname' => !empty($nickname) ? $nickname : $email, // 如果没有提供昵称，使用邮箱作为默认昵称
                'avatar' => $avatar,
                'balance' => 0.00,
                'is_vip' => 0,
                'vip_expired_at' => null,
                'latitude' => floatval($latitude),
                'longitude' => floatval($longitude),
                'created_at' => date('Y-m-d H:i:s'),
                'updated_at' => date('Y-m-d H:i:s')
            ];
            
            // 插入用户数据并获取自增ID
            $userId = Db::name('users')->insertGetId($userData);
            
            if ($userId) {
                // 生成token
                $token = $this->generateToken($userId);
                
                // 更新用户token
                Db::name('users')->where('id', $userId)->update([
                    'token' => $token,
                    'updated_at' => date('Y-m-d H:i:s')
                ]);
                
                // 获取完整的用户信息
                $user = Db::name('users')->where('id', $userId)->find();
                unset($user['password']); // 移除敏感信息
                return $this->success("注册成功", ["token" => $token, "user" => $user]);
            } else {
                return $this->error('注册失败，请重试');
            }
            
        } catch (\Exception $e) {
            return $this->error('注册失败：' . $e->getMessage());
        }
    }
    
    /**
     * 用户登出
     */
    public function logout()
    {
        $token = $this->request->header('Authorization');
        if ($token) {
            $token = str_replace('Bearer ', '', $token);
            // 将token加入黑名单（使用缓存实现）
            Cache::set('blacklist_token_' . $token, true, 86400 * 7); // 7天过期
        }
        
        return $this->success('登出成功');
    }
    
    /**
     * 获取用户信息
     */
    public function profile()
    {
        $token = $this->request->header('Authorization');
        if (!$token) {
            return $this->error('未提供认证token', 401);
        }
        
        $token = str_replace('Bearer ', '', $token);
        $userId = $this->getUserIdFromToken($token);
        
        if (!$userId) {
            return $this->error('无效的token', 401);
        }
        
        $user = Db::name('users')->where('id', $userId)->find();
        if (!$user) {
            return $this->error('用户不存在', 404);
        }
        
        // 检查VIP状态
        $this->checkVipStatus($userId);
        
        return $this->success('获取成功', [
            'user' => [
                'id' => $user['id'],
                'email' => $user['email'],
                'avatar' => $user['avatar'],
                'balance' => $user['balance'],
                'is_vip' => $user['is_vip'],
                'vip_expired_at' => $user['vip_expired_at'],
                'latitude' => $user['latitude'],
                'longitude' => $user['longitude'],
                'apple_user_id' => $user['apple_user_id'] ?? null
            ]
        ]);
    }
    
    /**
     * 验证Apple Token（简化版）
     */
    private function verifyAppleToken(string $identityToken): bool
    {
        // 实际项目中需要：
        // 1. 获取Apple的公钥
        // 2. 验证JWT签名
        // 3. 验证token的有效期
        // 4. 验证audience等字段
        
        // 这里简化处理，仅检查token格式
        $parts = explode('.', $identityToken);
        return count($parts) === 3;
    }
    
    /**
     * 创建Apple用户
     */
    private function createAppleUser(string $appleUserId, string $email, array $data): ?array
    {
        try {
            $userId = Db::name('users')->insertGetId([
                'email' => $email, // 使用传递参数中的email
                'password' => '', // Apple登录不需要密码
                'apple_user_id' => $appleUserId,
                'avatar' => $data['avatar'] ?? '',
                'balance' => 0.00,
                'is_vip' => 0,
                'latitude' => $data['latitude'] ?? 0.0,
                'longitude' => $data['longitude'] ?? 0.0,
                'created_at' => date('Y-m-d H:i:s'),
                'updated_at' => date('Y-m-d H:i:s')
            ]);
            
            if ($userId) {
                return Db::name('users')->where('id', $userId)->find();
            }
            
            return null;
        } catch (\Exception $e) {
            return null;
        }
    }
    
    /**
     * 检查VIP状态
     */
    private function checkVipStatus(int $userId): void
    {
        $user = Db::name('users')->where('id', $userId)->find();
        if ($user && $user['is_vip'] && $user['vip_expired_at']) {
            if (strtotime($user['vip_expired_at']) < time()) {
                // VIP已过期，更新状态
                Db::name('users')->where('id', $userId)->update([
                    'is_vip' => 0,
                    'updated_at' => date('Y-m-d H:i:s')
                ]);
            }
        }
    }
    
    /**
     * 生成用户token
     */
    private function generateToken(int $userId): string
    {
        $payload = [
            'user_id' => $userId,
            'exp' => time() + (86400 * 7), // 7天过期
            'iat' => time()
        ];
        
        return base64_encode(json_encode($payload)) . '.' . md5(json_encode($payload) . 'your_secret_key');
    }
    
    /**
     * 从token获取用户ID
     */
    private function getUserIdFromToken(string $token): ?int
    {
        // 检查token是否在黑名单中
        if (Cache::get('blacklist_token_' . $token)) {
            return null;
        }
        
        $parts = explode('.', $token);
        if (count($parts) !== 2) {
            return null;
        }
        
        try {
            $payload = json_decode(base64_decode($parts[0]), true);
            if (!$payload) {
                return null;
            }
            
            // 验证签名
            $expectedSign = md5(json_encode($payload) . 'your_secret_key');
            if ($parts[1] !== $expectedSign) {
                return null;
            }
            
            // 检查过期时间
            if ($payload['exp'] < time()) {
                return null;
            }
            
            return $payload['user_id'] ?? null;
        } catch (\Exception $e) {
            return null;
        }
    }
    
    /**
     * 成功响应
     */
    private function success(string $message, array $data = []): Response
    {
        return json([
            'code' => 200,
            'message' => $message,
            'data' => $data
        ]);
    }
    
    /**
     * 错误响应
     */
    private function error(string $message, int $code = 400): Response
    {
        return json([
            'code' => $code,
            'message' => $message,
            'data' => null
        ]);
    }
    
    /**
     * 发送邮箱验证码
     */
    public function sendVerificationCode()
    {
        $email = $this->request->param('email');
        $type = $this->request->param('type', 'register'); // register 或 reset
        
        // 验证邮箱格式
        if (empty($email) || !filter_var($email, FILTER_VALIDATE_EMAIL)) {
            return $this->error('请输入有效的邮箱地址');
        }
        
        try {
            // 检查邮箱发送频率限制（1分钟内只能发送一次）
            $recentCode = Db::name('verification_codes')
                ->where('email', $email)
                ->where('type', $type)
                ->where('created_at', '>', date('Y-m-d H:i:s', time() - 60))
                ->find();
                
            if ($recentCode) {
                return $this->error('验证码发送过于频繁，请稍后再试');
            }
            
            // 如果是注册验证码，检查邮箱是否已存在
            if ($type === 'register') {
                $existingUser = Db::name('users')->where('email', $email)->find();
                if ($existingUser) {
                    return $this->error('该邮箱已被注册');
                }
            }
            
            // 生成6位数字验证码
            $code = sprintf('%06d', mt_rand(100000, 999999));
            
            // 设置过期时间（10分钟）
            $expiredAt = date('Y-m-d H:i:s', time() + 600);
            
            // 保存验证码到数据库
            $result = Db::name('verification_codes')->insert([
                'email' => $email,
                'code' => $code,
                'type' => $type,
                'is_used' => 0,
                'expired_at' => $expiredAt,
                'created_at' => date('Y-m-d H:i:s'),
                'updated_at' => date('Y-m-d H:i:s')
            ]);
            
            if ($result) {
                // 发送邮件
                $emailSent = $this->sendEmail($email, $code, $type);
                
                if ($emailSent) {
                    return $this->success('验证码发送成功，请查收邮件');
                } else {
                    return $this->error('验证码发送失败，请稍后重试');
                }
            } else {
                return $this->error('验证码生成失败，请稍后重试');
            }
            
        } catch (\Exception $e) {
            return $this->error('发送验证码失败：' . $e->getMessage());
        }
    }
    
    /**
     * 验证邮箱验证码
     */
    private function verifyEmailCode(string $email, string $code, string $type = 'register'): bool
    {
        // 查找有效的验证码
        $verificationCode = Db::name('verification_codes')
            ->where('email', $email)
            ->where('code', $code)
            ->where('type', $type)
            ->where('is_used', 0)
            ->where('expired_at', '>', date('Y-m-d H:i:s'))
            ->find();
            
        if ($verificationCode) {
            // 标记验证码为已使用
            Db::name('verification_codes')
                ->where('id', $verificationCode['id'])
                ->update([
                    'is_used' => 1,
                    'updated_at' => date('Y-m-d H:i:s')
                ]);
            return true;
        }
        
        return false;
    }
    
    /**
     * 发送邮件
     */
    private function sendEmail(string $email, string $code, string $type): bool
    {
        $mailService = new MailService();
        return $mailService->sendVerificationCode($email, $code, $type);
    }
    
    /**
     * 重置密码
     */
    public function resetPassword()
    {
        $email = $this->request->post('email');
        $verificationCode = $this->request->post('verificationCode');
        $newPassword = $this->request->post('newPassword'); // 前端已加密的新密码
        
        // 验证必填字段
        if (empty($email) || empty($verificationCode) || empty($newPassword)) {
            return $this->error('邮箱、验证码和新密码不能为空');
        }
        
        // 验证邮箱格式
        if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
            return $this->error('邮箱格式不正确');
        }
        
        try {
            // 检查用户是否存在
            $user = Db::name('users')->where('email', $email)->find();
            if (!$user) {
                return $this->error('用户不存在');
            }
            
            // 验证邮箱验证码
            if (!$this->verifyEmailCode($email, $verificationCode, 'reset')) {
                return $this->error('验证码无效或已过期');
            }
            
            // 更新密码
            $result = Db::name('users')
                ->where('email', $email)
                ->update([
                    'password' => $newPassword, // 前端已加密，直接存储
                    'updated_at' => date('Y-m-d H:i:s')
                ]);
            
            if ($result) {
                return $this->success('密码重置成功');
            } else {
                return $this->error('密码重置失败，请重试');
            }
            
        } catch (\Exception $e) {
            return $this->error('密码重置失败：' . $e->getMessage());
        }
    }
}